/**
 * 
 */
package tirateima.gui.componente;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.util.ArrayList;
import java.util.List;
import java.awt.Point;


import javax.rmi.CORBA.Util;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

import tirateima.util.UtilZoom;

/**
 * Componente grafico para representação de filas
 *
 */
public class FilaComponente extends JPanel implements ICopiavel, IZoom {

    protected ArrayList<JLabel> fila = new ArrayList<JLabel>();
    private Color cor;
    private Point posicao;
    private Dimension tamanho;
	private double proporcao;
    
    /**
     * Construtor do componente.
     * @param String nomeFila
     * @param Color cor
     * @param Point posicao
     * @param Dimension tamanho
     */
    public FilaComponente(String nomeFila, Color cor, Point posicao, Dimension tamanho) {
        this.setLayout(new FlowLayout(FlowLayout.LEADING));
        this.setBorder(BorderFactory.createTitledBorder(BorderFactory.createMatteBorder(3, 0, 3, 0, cor), nomeFila));
        this.setBounds(posicao.x, posicao.y, tamanho.width, tamanho.height);
        this.setName(nomeFila);
        this.cor = cor;
        this.posicao = posicao;
        this.tamanho = tamanho;
    }
 
    /**
     * Remove da lista
     * @return o item removido
     * @see java.util.Deque#pop()
     */
    public String remover() {
        JLabel retorno = null;
        retorno = fila.remove(0);
        return retorno.getText();

    }

    /**
     * Insere um item na lista
     * @param String a ser inserida
     * @see java.util.Deque#push(java.lang.Object)
     */
    public void inserir(String e) {
        JLabel label = new JLabel(e, JLabel.CENTER);
        label.setBorder(BorderFactory.createEtchedBorder());
//        label.setIcon(new ImageIcon(getClass().getResource("/boneco.png")));
        fila.add(label);

    }

    /**
     * Colore um item
     * @param Indice do item.
     * @param Cor
     */
    public void colorirItem(int item, Color cor){
        fila.get(item).setForeground(Color.orange);
        fila.get(item).setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,cor, cor.darker()));
    }

    /**
     * Descolore um item
     * @param Indice do item.
     */
    public void descolorirItem(int item){
        fila.get(item).setForeground(Color.BLACK);
        fila.get(item).setBorder(BorderFactory.createEtchedBorder());
    }

    /**
     * Atualiza o desenho do componente.
     */
    private void desenhaComponente() {
    	if(fila==null) return;
    	
        this.removeAll();
        for (JLabel item : fila) {
        	item.setFont(new Font(Font.DIALOG, Font.PLAIN, (int)(14 * proporcao)));
//        	item.setBounds(item.getBounds().x, item.getBounds().y, (int)(item.getBounds().width * proporcao), (int)(item.getBounds().height));
        	item.setText(item.getText());
//        	item.setSize(item.getPreferredSize());
        	item.validate();
            this.add(item);
        }
    }
    
    /**
     * Metodo sobrescrito para redesenhar o componente com os novos itens inseridos.
     */
    @Override
    public void revalidate() {
    	desenhaComponente();
    	super.revalidate();
    }
	
	/* (non-Javadoc)
	 * @see tirateima.gui.componente.ICopiavel#criarCopia()
	 */
	@Override
	public JComponent criarCopia() {
		FilaComponente retorno = new FilaComponente(this.getName(), this.cor, this.posicao, this.tamanho);
		retorno.fila = (ArrayList<JLabel>) this.fila.clone();
		return retorno;
	}

	/*
	 * (non-Javadoc)
	 * @see tirateima.gui.componente.IZoom#setProporcao(double)
	 */
	@Override
	public void setProporcao(double prop) {
		proporcao = prop;
		this.setBounds((int)(posicao.x * UtilZoom.calculaProporcao(prop)), (int)(posicao.y * UtilZoom.calculaProporcao(prop)), (int)(tamanho.width * UtilZoom.calculaProporcao(prop)), (int)(tamanho.height * UtilZoom.calculaProporcao(prop)));
		this.revalidate();
	}

}
